package rkdwogus7.basic;

public class J16_Printer {

	public static void main(String[] args) {
		// 인터페이스 활용하기
		
		
	} // main

	
	
} // class

class PrinterV2 {
	private String model;
	private String maker; 
	private String type; 
	private int papers; 
	private int remain;
	
	// Printer 클래스와 달리 method는 정의하지 않음. 상속관계에 의해 
	// 부모클래스의 method가 무시당할 것이므로 아예 만들지 않음
	
}

// 모든 프린터가 기본적으로 제공해야 하는 표준 기능을 인터페이스로 작성
interface PrinterV2Service {
	void print();
	int showRemain();	// 잔량 정보 표시. 잉크젯은 있지만 레이저는 없다고 생각해 봐.
	                    // 이 method를 매 번 구현해야 하겠지?
}

// PrinterV2 class와 PrinterV2Service interface를 이용해서 Inkjet, Laser 프린터 클래스 작성
class InkjetPrinterV2 extends PrinterV2 implements PrinterV2Service {

	@Override
	public void print() {
		System.out.println( "잉크젯 프린터입니다!!" );
	}

	@Override
	public int showRemain() {
		return 100;
	}
	
}

class LaserPrinterV2 extends PrinterV2 implements PrinterV2Service {

	@Override
	public void print() {
		System.out.println( "레이저 프린터 입니다" );
	}

	// 레이저 프린터에서는 제공하지 않는 기능이지만 인터페이스를 구현했으므로
	// 어쩔 수 없이 showRemain method를 재정의 해야 함. 즉, 필요 없지만 약속에 의해 억지로 작성.
	@Override
	public int showRemain() {
		return 0;
	}
	
}

// 잉크젯 / 레이저 프린터 클래스를 작성하기 위해 extends와 implements 예약어를 사용하는 것은
// 왠지 복잡해 보임. 또, 특정 클래스에서 사용하지 않는 method임에도 불구하고
// 인터페이스 규칙 상 작성해야 하는 불편함도 존재.
// (ex. Inkjet : print(), showRemain() 제공)
// (ex. Laser : print() 만 제공)
// 따라서, 이것을 간편하게 작성하기 위해 기본 클래스base class 개념을 도입함

interface PrinterV3Service {
	void print();
	int showRemain();
}

class PrinterV3 implements PrinterV3Service {
	private String model;
	private String maker; 
	private String type; 
	private int papers; 
	private int remain;
	
	@Override
	public void print() {
		System.out.println( "프린터입니다!" );
		
	}

	@Override
	public int showRemain() {
		return 0;
	}
	
}

class InkjetPrinterV3 extends PrinterV3 {
	@Override
	public void print() {
		System.out.println( "잉크젯프린터입니다!" );
	}
	
	@Override
	public int showRemain() {
		return 100;
	}
	
}

class LaserPrinterV3 extends PrinterV3 {
	@Override
	public void print() {
		System.out.println( "레이저 프린터입니다!" );
	}
	
}









